/**
 * 文件名：@VelocityRenderer.java <br/>
 * 包名：cn.efunbox.afw.core.renderer.velocity <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.renderer.velocity;

import java.io.Writer;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;

import cn.efunbox.afw.core.renderer.AbstractRenderer;

/**
 * 类名：VelocityRenderer  <br />
 *
 * 功能：基于Velocity模板引擎的模板渲染实现
 *
 * @author xtwin <br />
 * 创建时间：2015年12月1日 下午4:16:03  <br />
 * @version 2015年12月1日
 */
public class VelocityRenderer extends AbstractRenderer {
	
	// 渲染引擎
	protected VelocityEngine engine;
	
	/**
	 * 构造方法
	 */
	public VelocityRenderer() {
		// 默认后缀
		setSuffix(".vm");
	}

	/**
	 * 功能:使用velocity执行模板渲染 <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月1日 下午4:16:40<br/>
	 * 
	 * @param writer
	 * @param template
	 * @param encoding
	 * @param datas
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.renderer.AbstractRenderer#doRender(java.io.Writer, java.lang.String, java.lang.String, java.lang.Object)
	 */
	@Override
	protected void doRender(Writer writer, String template, String encoding, Object datas) throws Exception {
		getTemplate(template, encoding, datas).merge(getContext(template, encoding, datas), writer);
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月1日 下午4:21:37 <br/>
	 */
	protected Context getContext(String template, String encoding, Object datas) {
		return new VelocityContext();
	}
	
	/**
	 * 
	 * 功能：获取模板对象，可以通过重写该方法，实现从其它地方加载模板，如数据库中 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月1日 下午4:19:39 <br/>
	 */
	protected Template getTemplate(String template, String encoding, Object datas) throws Exception {
		return engine.getTemplate(template, encoding);
	}

	/**
	 * @version 2015年12月1日-下午4:22:17
	 */
	public void setEngine(VelocityEngine engine) {
		this.engine = engine;
	}
}
